home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cocktail / estra.lha / estra / src / Match.mi < prev    next >
Text File  |  1992-08-18  |  17KB  |  719 lines

  1. (* $Id: Match.mi,v 2.1 1992/01/30 14:26:17 grosch rel $ *)
  2.  
  3. IMPLEMENTATION MODULE Match;
  4.  
  5. FROM ArgCheck    IMPORT    BU;
  6. FROM Automaton    IMPORT    BeginAutomaton, DefineTransition, CloseAutomaton;
  7. FROM Character    IMPORT    Concatenate;
  8. FROM Checks    IMPORT    CheckOpenOutput;
  9. FROM Convert    IMPORT    IdToAdr;
  10. FROM DynArray    IMPORT    MakeArray, ExtendArray, ReleaseArray;
  11. FROM Environs    IMPORT    MaxDirective, GetPattern;
  12. FROM Errors    IMPORT    ERROR;
  13. FROM General    IMPORT    Max;
  14. FROM Grammar    IMPORT    tLayout, Arity, ClassesOfNode, SonClass, MainClass,
  15.             Layout, Subclasses, NodesOfClass,
  16.             MaxArity;
  17. FROM Idents    IMPORT    tIdent, GetString;
  18. FROM Parser    IMPORT    AST;
  19. FROM Patterns    IMPORT    tPattern, tRelation, GetPatternId, GetPatternSon,
  20.             SynthesizePatterns, NormPattern, Relation,
  21.             PatternClasses, MakePattern, ReleasePattern;
  22. FROM Queues    IMPORT    tQueue, MakeQueue, Append, ReleaseQueue, ClearLast,
  23.             Insert, ClearHead, GetElement;
  24. FROM Scanner    IMPORT    MaxIdent, NoIdent;
  25. FROM Sets    IMPORT    tSet, MakeSet, ReleaseSet, IsElement, IsEmpty,
  26.             Include, Assign, AssignEmpty, IsEqual, Exclude,
  27.             Extract, Intersection, IsSubset, Union;
  28. FROM Stack    IMPORT    tStack, MakeStack, ReleaseStack, Pop, IsEmptyStack;
  29. FROM Strings    IMPORT    tString, StringToArray;
  30. FROM System    IMPORT    tFile, OpenOutput, Close, Write;
  31. FROM SYSTEM    IMPORT    TSIZE, ADDRESS, ADR;
  32. FROM Types    IMPORT    tType, Type, AllNodes;
  33.  
  34. IMPORT    Patterns, Strings;
  35.  
  36. (* MATCH_ *)
  37. FROM ArgCheck    IMPORT    AUTO, MATCH, TEST;
  38. FROM Automaton    IMPORT    WriteAutomaton, WriteFunction, WriteComb;
  39. FROM Idents    IMPORT    WriteIdent;
  40. FROM IO        IMPORT    StdOutput;
  41. FROM Patterns    IMPORT    WritePattern;
  42. FROM Queues    IMPORT    Length;
  43. FROM Sets    IMPORT    WriteSet;
  44. FROM StdIO    IMPORT    WriteS, WriteI, WriteNl;
  45. (* _MATCH *)
  46.  
  47. CONST
  48.   cTabPost = '.tab';
  49.   InitPatternTableSize = 100;
  50.   InitMatchSetTableSize = 100;
  51.   NoIndex = -1;
  52.   BitsPerBitset = 32;
  53.  
  54. TYPE
  55.   tPatternTableEntry =
  56.     RECORD
  57.       Pat: tPattern;
  58.       Numbers: tSet;
  59.       SonNumbers: POINTER TO ARRAY [0..100] OF INTEGER;
  60.     END;
  61.   
  62.   tMatchSetTableEntry =
  63.     RECORD
  64.       Set: tSet;
  65.     END;
  66.  
  67. VAR
  68.   PatternTable: POINTER TO ARRAY [0..1000] OF tPatternTableEntry;
  69.   PatternTableSize, PatternTableCount: LONGINT;
  70.  
  71.   MatchSetTable: POINTER TO ARRAY [0..1000] OF tMatchSetTableEntry;
  72.   MatchSetTableSize, MatchSetTableCount: LONGINT;
  73.  
  74.   SonMatchSets: POINTER TO ARRAY [0..100] OF tSet;
  75.   ClassToPattern: POINTER TO ARRAY [0..1000] OF INTEGER;
  76.  
  77.   mIndex: LONGINT;
  78.  
  79.  
  80. (* ---------- patterns ---------- *)
  81.  
  82. PROCEDURE PutPattern (pat: tPattern; no: INTEGER): INTEGER;
  83.   VAR
  84.     index: LONGINT;
  85.     size: LONGINT;
  86.     ident: tIdent;
  87.   BEGIN
  88.     FOR index := 0 TO PatternTableCount DO
  89.       IF Patterns.IsEqual (pat, PatternTable^[index].Pat) THEN
  90.     IF no # NoIndex THEN
  91.       Include (PatternTable^[index].Numbers, no);
  92.     END;
  93.     RETURN index;
  94.       END;
  95.     END;
  96.     INC (PatternTableCount);
  97.     IF PatternTableSize = 0 THEN
  98.       PatternTableSize := InitPatternTableSize;
  99.       MakeArray (PatternTable, PatternTableSize, TSIZE (tPatternTableEntry));
  100.     ELSIF PatternTableCount = PatternTableSize THEN
  101.       ExtendArray (PatternTable, PatternTableSize, TSIZE (tPatternTableEntry));
  102.     END;
  103.     WITH PatternTable^[PatternTableCount] DO
  104.       Pat := pat;
  105.       MakeSet (Numbers, MaxDirective ());
  106.       IF no # NoIndex THEN
  107.     Include (Numbers, no);
  108.       END;
  109.       IF (pat = NIL) THEN
  110.     SonNumbers := NIL;
  111.       ELSE
  112.     ident := GetPatternId (pat);
  113.     IF (Type (ident) = cNode) THEN
  114.       size := Arity (ident) + 1;
  115.       MakeArray (SonNumbers, size, TSIZE (INTEGER));
  116.     ELSE
  117.       SonNumbers := NIL;
  118.       ClassToPattern^ [ident] := PatternTableCount;
  119.     END;
  120.       END;
  121.     END;
  122.     RETURN PatternTableCount;
  123.   END PutPattern;
  124.  
  125. PROCEDURE Defined (pat: tPattern): BOOLEAN;
  126.   VAR
  127.     index: LONGINT;
  128.   BEGIN
  129.     FOR index := 0 TO PatternTableCount DO
  130.       IF Patterns.IsEqual (pat, PatternTable^[index].Pat) THEN
  131.     RETURN TRUE;
  132.       END;
  133.     END;
  134.     RETURN FALSE;
  135.   END Defined;
  136.  
  137. PROCEDURE CollectPatterns;
  138.   VAR
  139.     no: INTEGER;
  140.     index: INTEGER;
  141.   BEGIN
  142.     IF MaxDirective () = 0 THEN
  143.       index := PutPattern (NIL, NoIndex);
  144.     ELSE
  145.       FOR no := 1 TO MaxDirective () DO
  146.     index := PutPattern (GetPattern (no), no);
  147.       END;
  148.     END;
  149.   END CollectPatterns;
  150.  
  151. PROCEDURE CollectSubPatterns;
  152.   VAR
  153.     index, i: LONGINT;
  154.     id: tIdent;
  155.     pos: INTEGER;
  156.     pat, sub: tPattern;
  157.     pats: tStack;
  158.  
  159.   BEGIN
  160.     index := -1;
  161.     MakeStack (pats);
  162.     WHILE index < PatternTableCount DO
  163.       INC (index);
  164.       pat := PatternTable^[index].Pat;
  165.       IF pat # NIL THEN
  166.     id := GetPatternId (pat);
  167.     IF Type (id) = cNode THEN
  168.       FOR pos := 1 TO Arity (id) DO
  169.         sub := GetPatternSon (pat, pos);
  170.             PatternTable^[index].SonNumbers^[pos]
  171.           := PutPattern (sub, NoIndex);
  172.       END;
  173.     ELSE
  174.       SynthesizePatterns (id, pats);
  175.       WHILE NOT IsEmptyStack (pats) DO
  176.         i := PutPattern (NormPattern (Pop (pats)), NoIndex);
  177.       END;
  178.     END;
  179.       END;
  180.     END;
  181.     ReleaseStack (pats);
  182.   END CollectSubPatterns;
  183.  
  184.  
  185. (* ---------- match sets ---------- *)
  186.  
  187. PROCEDURE PutMatchSet (set: tSet);
  188.   BEGIN
  189.     INC (MatchSetTableCount);
  190.     IF MatchSetTableSize = 0 THEN
  191.       MatchSetTableSize := InitMatchSetTableSize;
  192.       MakeArray (MatchSetTable, MatchSetTableSize, TSIZE (tMatchSetTableEntry));
  193.     ELSIF MatchSetTableCount = MatchSetTableSize THEN
  194.       ExtendArray (MatchSetTable, MatchSetTableSize, TSIZE (tMatchSetTableEntry));
  195.     END;
  196.     WITH MatchSetTable^[MatchSetTableCount] DO
  197.       MakeSet (Set, PatternTableCount);
  198.       Assign (Set, set);
  199.     END;
  200.   END PutMatchSet;
  201.  
  202. PROCEDURE MatchSetIndex (set: tSet): INTEGER;
  203.   BEGIN
  204.     IF IsEqual (set, MatchSetTable^[mIndex].Set) THEN
  205.       RETURN mIndex;
  206.     END;
  207.     mIndex := 0;
  208.     LOOP
  209.       IF mIndex > MatchSetTableCount THEN EXIT END;
  210.       IF IsEqual (set, MatchSetTable^[mIndex].Set) THEN
  211.     RETURN mIndex;
  212.       END;
  213.       INC (mIndex);
  214.     END;
  215.     (* MATCH1_   
  216.     WriteS ('MatchSetIndex:  set '); 
  217.     WriteSet (StdOutput, set);
  218.     WriteS (' missing'); 
  219.     WriteNl;
  220.     ERROR ('MatchSetIndex'); 
  221.        _MATCH1 *)
  222.     RETURN NoIndex;
  223.   END MatchSetIndex;
  224.  
  225.  
  226. PROCEDURE InMatchSet (elmt: INTEGER; set: INTEGER): BOOLEAN;
  227.   BEGIN
  228.     RETURN IsElement (elmt, MatchSetTable^[set].Set);
  229.   END InMatchSet;
  230.   
  231.  
  232. PROCEDURE MakeMatchSets;
  233.   VAR
  234.     set: tSet;
  235.   BEGIN
  236.     MakeSet (set, PatternTableCount);
  237.     SynthesizeMatchSets (-1, set);
  238.     ReleaseSet (set);
  239.   END MakeMatchSets;
  240.  
  241. PROCEDURE SynthesizeMatchSets (last: LONGINT; VAR set: tSet);
  242.   VAR
  243.     i, index: LONGINT;
  244.     pat, oldpat: tPattern;
  245.     in, notin: BOOLEAN;
  246.   BEGIN
  247.     IF last = PatternTableCount THEN
  248.       
  249.       (* set is complete *)
  250.       PutMatchSet (set);
  251.  
  252.     ELSE
  253.       index := last + 1;
  254.       pat := PatternTable^[index].Pat;
  255.  
  256.  
  257.       IF pat = NIL THEN
  258.     in := TRUE;
  259.     notin := FALSE;
  260.       ELSE
  261.  
  262.     in := TRUE;
  263.     notin := TRUE;
  264.  
  265.     FOR i := 0 TO last DO
  266.       oldpat := PatternTable^[i].Pat;
  267.       IF IsElement (i, set) THEN
  268.         CASE Relation (oldpat, pat) OF
  269.         | cIndependent:    ;
  270.         | cInconsistent:    in := FALSE;
  271.         | cSubsumes:    notin := FALSE;
  272.         | cSupersumes:    ;
  273.         | cEqual:        ERROR ('SynthesizeMatchSets');
  274.         END;
  275.       ELSE
  276.         CASE Relation (oldpat, pat) OF
  277.         | cIndependent:    ;
  278.         | cInconsistent:    ;
  279.         | cSubsumes:    ;
  280.         | cSupersumes:    in := FALSE;
  281.         | cEqual:        ERROR ('SynthesizeMatchSets');
  282.         END;
  283.       END;
  284.     END;
  285.  
  286.       END;
  287.  
  288.       IF in THEN
  289.     Include (set, index);
  290.     SynthesizeMatchSets (index, set);
  291.     Exclude (set, index);
  292.       END;
  293.  
  294.       IF notin THEN
  295.     SynthesizeMatchSets (index, set);
  296.       END;
  297.  
  298.     END;
  299.   END SynthesizeMatchSets;
  300.  
  301.  
  302. PROCEDURE OutputMatchSets (f: tFile);
  303.   VAR
  304.     lindex, index: LONGINT;
  305.     bitset: BITSET;
  306.     elmtno, bitno, setno: INTEGER;
  307.     i, max: INTEGER;
  308.     directives: tSet;
  309.   BEGIN
  310.     max := MaxDirective ();
  311.     MakeSet (directives, max);
  312.     FOR index := 0 TO MatchSetTableCount DO
  313.       AssignEmpty (directives);
  314.       FOR lindex := 0 TO PatternTableCount DO
  315.     IF IsElement (lindex, MatchSetTable^[index].Set) THEN
  316.       Union (directives, PatternTable^[lindex].Numbers);
  317.         END;
  318.       END;
  319.       FOR setno := 0 TO MaxDirective () DIV BitsPerBitset DO
  320.         bitset := BITSET {};
  321.     FOR bitno := 0 TO BitsPerBitset - 1  DO
  322.       elmtno := setno * BitsPerBitset + bitno;
  323.       IF (elmtno <= max) & IsElement (elmtno, directives) THEN
  324.         INCL (bitset, bitno);
  325.       END;
  326.     END;
  327.     i := Write (f, ADR (bitset), TSIZE (BITSET));
  328.       END;
  329.     END;
  330.     ReleaseSet (directives);
  331.   END OutputMatchSets;
  332.  
  333.  
  334. (* --------- match tables --------- *)
  335.  
  336. PROCEDURE MakeMatchTables;
  337.   VAR
  338.     nodes: tSet;
  339.     node: tIdent;
  340.     size: LONGINT;
  341.     pos: INTEGER;
  342.   BEGIN
  343.     size := MaxArity () + 1;
  344.     MakeArray (SonMatchSets, size, TSIZE (tSet));
  345.     FOR pos := 1 TO MaxArity () DO
  346.       MakeSet (SonMatchSets^[pos], MatchSetTableCount);
  347.     END;
  348.     MakeSet (nodes, MaxIdent);
  349.     AllNodes (nodes);
  350.     WHILE NOT IsEmpty (nodes) DO
  351.       node := Extract (nodes);
  352.       MakeMatchTable (node);
  353.     END;
  354.     ReleaseSet (nodes);
  355.     ReleaseArray (SonMatchSets, size, TSIZE (tSet));
  356.   END MakeMatchTables;
  357.  
  358. PROCEDURE MakeMatchTable (node: tIdent);
  359.   VAR
  360.     pos: INTEGER;
  361.     set: tSet;
  362.     arity, index: INTEGER;
  363.     indexes: tQueue;
  364.     pat: tPattern;
  365.     layout: tLayout;
  366.   BEGIN
  367.     MakeSet (set, PatternTableCount);
  368.     FOR index := 0 TO PatternTableCount DO
  369.       pat  := PatternTable^[index].Pat;
  370.       IF (pat # NIL) 
  371.        & (GetPatternId (pat) = node) THEN
  372.           Include (set, index);
  373.       END;
  374.     END;
  375.  
  376.     IF MainClass (node) # NoIdent THEN
  377.       arity := Arity (node);
  378.       layout := Layout (node, MainClass (node));
  379.       MakeQueue (indexes);
  380.       DefineSonMatchSets (0, arity, layout);
  381.       DefineMatchTable (node, set, 0, arity, indexes, layout);
  382.       ReleaseQueue (indexes);
  383.     END;
  384.     ReleaseSet (set);
  385.   END MakeMatchTable;
  386.  
  387. PROCEDURE DefineSonMatchSets (pos: INTEGER; arity: INTEGER; layout: tLayout);
  388.   VAR
  389.     class: tIdent;
  390.     classpat, pat: tPattern;
  391.     IndexSet: tSet;
  392.     lindex: LONGINT;
  393.   BEGIN
  394.  
  395.     IF pos = arity THEN RETURN END;
  396.  
  397.     INC (pos);
  398.     
  399.     MakeSet (IndexSet, PatternTableCount);
  400.  
  401.     (* compute possible patterns for son at actual position *)
  402.  
  403.     class := SonClass (layout, pos);
  404.     classpat := NormPattern (MakePattern (class));
  405.     FOR lindex := 0 TO PatternTableCount DO
  406.       pat := PatternTable^[lindex].Pat;
  407.       IF Relation (classpat, pat) # cInconsistent THEN
  408.     Include (IndexSet, lindex);
  409.       END;
  410.     END;
  411.     ReleasePattern (classpat);
  412.  
  413.     (* compute possible match sets indexes for son at actual position *)
  414.  
  415.     AssignEmpty (SonMatchSets^[pos]);
  416.     FOR lindex := 0 TO MatchSetTableCount DO
  417.       IF IsSubset (MatchSetTable^[lindex].Set, IndexSet) THEN
  418.     Include (SonMatchSets^[pos], lindex);
  419.       END;
  420.     END;
  421.  
  422.     ReleaseSet (IndexSet);
  423.     
  424.     DefineSonMatchSets (pos, arity, layout);
  425.  
  426.   END DefineSonMatchSets;
  427.  
  428. PROCEDURE DefineMatchTable (node: tIdent; set: tSet;
  429.                 pos: INTEGER; arity: INTEGER;
  430.                 VAR indexes: tQueue; layout: tLayout);
  431.   VAR
  432.     lindex: LONGINT;
  433.     index: INTEGER;
  434.     MatchSet, set2: tSet;
  435.     pat: tPattern;
  436.   BEGIN
  437.     IF pos = arity THEN
  438.       FOR lindex := 0 TO PatternTableCount DO
  439.     pat  := PatternTable^[lindex].Pat;
  440.     IF (pat = NIL) THEN
  441.       Include (set, lindex);
  442.     ELSIF Type (GetPatternId (pat)) = cClass THEN
  443.       IF MatchClass (node, layout, indexes, GetPatternId (pat)) THEN
  444.         Include (set, lindex);
  445.       END;
  446.     END;
  447.       END;
  448.       DefineEntry (node, indexes, set);
  449.     ELSE
  450.       INC (pos);
  451.       
  452.       MakeSet (MatchSet, MatchSetTableCount);
  453.       Assign (MatchSet, SonMatchSets^ [pos]);
  454.  
  455.       MakeSet (set2, PatternTableCount);
  456.  
  457.       (* compute possible patterns (at all) for each match set *)
  458.  
  459.       WHILE NOT IsEmpty (MatchSet) DO
  460.     index := Extract (MatchSet);
  461.  
  462.     (* compute possible patterns by copying set in set2 
  463.        and then checking set2 *)
  464.  
  465.     Assign (set2, set);
  466.     lindex := -1;
  467.     LOOP
  468.       IF lindex = PatternTableCount THEN EXIT END;
  469.       INC (lindex);
  470.       IF IsElement (lindex, set2) THEN
  471.         
  472.         (* up to now lindex is possible *)
  473.         
  474.         (* assertion: there must be a node pattern at lindex! *)
  475.         IF NOT IsElement (PatternTable^[lindex].SonNumbers^[pos],
  476.                   MatchSetTable^[index].Set) THEN
  477.           Exclude (set2, lindex);
  478.         END;
  479.  
  480.       END;
  481.     END;
  482.     
  483.  
  484.     (* go into recursion *)
  485.         
  486.     Append (indexes, ADDRESS (index));
  487.     DefineMatchTable (node, set2, pos, arity, indexes, layout);
  488.     ClearLast (indexes);
  489.         
  490.       END;
  491.       ReleaseSet (set2);
  492.       ReleaseSet (MatchSet);
  493.     END;
  494.   END DefineMatchTable;
  495.  
  496. PROCEDURE DefineEntry (node: tIdent; VAR indexes: tQueue; set: tSet);
  497.   VAR
  498.     matchindex: INTEGER;
  499.   BEGIN
  500.     matchindex := MatchSetIndex (set);
  501.     (* MATCH1_   
  502.     IF matchindex = NoIndex THEN
  503.       WriteEntry (node, indexes, set);
  504.     END;
  505.        _MATCH1 *)
  506.     Insert (indexes, IdToAdr (node));
  507.     DefineTransition (indexes, matchindex);
  508.     ClearHead (indexes);
  509.   END DefineEntry;
  510.  
  511. PROCEDURE MatchClass (node: tIdent; layout: tLayout;
  512.               indexes: tQueue; class: tIdent): BOOLEAN;
  513.   VAR
  514.     mainclass: tIdent;
  515.     classes, nodes: tSet;
  516.     nodelayout: tLayout;
  517.     sonclass: tIdent;
  518.     match: BOOLEAN;
  519.     set, index, pos: INTEGER;
  520.   BEGIN
  521.     mainclass := MainClass (node);
  522.     IF class = mainclass THEN RETURN TRUE END;
  523.     MakeSet (classes, MaxIdent);
  524.     MakeSet (nodes, MaxIdent);
  525.     Subclasses (class, classes);
  526.     match := FALSE;
  527.     LOOP
  528.       NodesOfClass (class, nodes);
  529.       IF IsElement (node, nodes) THEN
  530.     match := TRUE;
  531.         nodelayout := Layout (node, class);
  532.     FOR pos := 1 TO Arity (node) DO
  533.       IF match THEN
  534.         sonclass := SonClass (nodelayout, pos);
  535.         IF sonclass # SonClass (layout, pos) THEN
  536.           set := INTEGER (GetElement (indexes, pos));
  537.           index := ClassToPattern^[sonclass];
  538.           IF index = NoIndex THEN
  539.         (* MATCH_ *)
  540.         WriteS ('MatchClass: ');
  541.         WriteIdent (StdOutput, sonclass);
  542.         WriteS (' is not defined');
  543.         WriteNl;
  544.         (* _MATCH *)
  545.         ERROR ('MatchClass');
  546.           END;
  547.           match := IsElement (index, MatchSetTable^[set].Set);
  548.         END;
  549.       END;
  550.     END;
  551.     IF match THEN EXIT END;
  552.       END;
  553.       IF IsEmpty (classes) THEN EXIT; END;
  554.       class := Extract (classes);
  555.     END;
  556.  
  557.     ReleaseSet (nodes);
  558.     ReleaseSet (classes);
  559.     RETURN match;
  560.   END MatchClass;
  561.  
  562.  
  563.  
  564. (* --------- tables --------- *)
  565.  
  566. PROCEDURE MakeTables;
  567.   VAR
  568.     file: tFile;
  569.     filename: ARRAY [0..127] OF CHAR;
  570.     s: tString;
  571.     name: tIdent;
  572.     size: LONGINT;
  573.     id: tIdent;
  574.  
  575.   BEGIN
  576.     IF BU THEN
  577.       size := MaxIdent + 1;
  578.       MakeArray (ClassToPattern, size, TSIZE (INTEGER));
  579.       FOR id := 0 TO MaxIdent DO
  580.     ClassToPattern^ [id] := NoIndex;
  581.       END;
  582.       name := AST^.Spec.name;
  583.       IF name = NoIdent THEN
  584.     Strings.AssignEmpty (s);
  585.       ELSE
  586.     GetString (name, s);
  587.       END;
  588.       Strings.Append (s, 0C);
  589.       StringToArray (s, filename);
  590.       Concatenate (filename, cTabPost);
  591.       file := OpenOutput (filename);
  592.       CheckOpenOutput (file, filename);
  593.       CollectPatterns;
  594.       CollectSubPatterns;
  595.       MakeMatchSets;
  596.       OutputMatchSets (file);
  597.  
  598.       (* MATCH_ *)
  599.       IF MATCH THEN
  600.     WritePatternTable;
  601.     WriteMatchSetTable;
  602.       END;
  603.       (* _MATCH *)
  604.  
  605.       BeginAutomaton (MatchSetTableCount, Max (MatchSetTableCount, MaxIdent));
  606.       MakeMatchTables;
  607.  
  608.       (* MATCH_ *)
  609.       IF AUTO THEN
  610.     WriteAutomaton;
  611.       END;
  612.       (* _MATCH *)
  613.  
  614.       CloseAutomaton (file, CombSize);
  615.       MaxMatchIndex := MatchSetTableCount;
  616.       Close (file);
  617.  
  618.       (* MATCH_ *)
  619.       IF AUTO THEN
  620.     WriteAutomaton;
  621.       END;
  622.       IF MATCH THEN
  623.     WriteFunction;
  624.     WriteComb;
  625.       END;
  626.       (* _MATCH *)
  627.     END;
  628.  
  629.  
  630.   END MakeTables;
  631.  
  632.  
  633. (* --------- test --------- *)
  634.  
  635. (* MATCH_ *)
  636.  
  637. PROCEDURE WritePatternTable;
  638.   VAR
  639.     index: LONGINT;
  640.     pos: INTEGER;
  641.   BEGIN
  642.     WriteS (' Pattern Table ');
  643.     WriteNl;
  644.     FOR index := 0 TO PatternTableCount DO
  645.       WITH PatternTable^[index] DO
  646.     WriteI (index, 3);
  647.     WriteS ('  ');
  648.     WritePattern (StdOutput, Pat);
  649.     WriteNl;
  650.     WriteS ('     ');
  651.     WriteSet (StdOutput, Numbers);
  652.     WriteS (' - ');
  653.     IF (Pat # NIL) & (Type (GetPatternId (Pat)) = cNode) THEN
  654.       FOR pos := 1 TO Arity (GetPatternId (Pat)) DO
  655.         WriteS (' ');
  656.         WriteI (SonNumbers^[pos], 1);
  657.       END;
  658.     END;
  659.     WriteNl;
  660.       END;
  661.     END;
  662.     WriteNl;
  663.   END WritePatternTable;
  664.  
  665. PROCEDURE WriteMatchSetTable;
  666.   VAR
  667.     lindex, index: LONGINT;
  668.     directives: tSet;
  669.   BEGIN
  670.     WriteS (' Match-Set Table ');
  671.     WriteNl;
  672.     MakeSet (directives, MaxDirective ());
  673.     FOR index := 0 TO MatchSetTableCount DO
  674.       WriteI (index, 3);
  675.       WITH MatchSetTable^[index] DO
  676.     WriteS (' ');
  677.     WriteSet (StdOutput, Set);
  678.       END;
  679.       WriteS ('    ');
  680.       AssignEmpty (directives);
  681.       FOR lindex := 0 TO PatternTableCount DO
  682.     IF IsElement (lindex, MatchSetTable^[index].Set) THEN
  683.       Union (directives, PatternTable^[lindex].Numbers);
  684.         END;
  685.       END;
  686.       WriteSet (StdOutput, directives);
  687.       WriteNl;
  688.     END;
  689.     ReleaseSet (directives);
  690.     WriteNl;
  691.   END WriteMatchSetTable;
  692.  
  693. PROCEDURE WriteEntry (node: tIdent; indexes: tQueue; set: tSet);
  694.   VAR
  695.     pos: INTEGER;
  696.     index: INTEGER;
  697.   BEGIN
  698.     index := MatchSetIndex (set);
  699.     WriteIdent (StdOutput, node);
  700.     WriteS ('( ');
  701.     FOR pos := 1 TO Length (indexes) DO
  702.       WriteI (INTEGER (GetElement (indexes, pos)), 1);
  703.       WriteS (' ');
  704.     END;
  705.     WriteS (')  = ');
  706.     WriteI (index, 1);
  707.     WriteNl;
  708.   END WriteEntry;
  709.  
  710. (* _MATCH *)
  711.  
  712. BEGIN
  713.   PatternTableSize := 0;
  714.   PatternTableCount := -1;
  715.   MatchSetTableSize := 0;
  716.   MatchSetTableCount := -1;
  717.   mIndex := 0;
  718. END Match.
  719.